use std::{env , ffi::OsStr , fmt::Write, process::Output} ;

use regex::Regex;
use jizi_adapter::Mux;

use super::Actions;
/*
debug.rs会综合检测多个crate的情况  
在没有完成其他crate开发的情况下，现在暂停对此文件的仿写
*/
impl Actions{
    pub (super) fn debug() -> Result<String,std::fmt::Error> {
        let mut s = String::new() ;
        writeln!(s , "\nJizi") ?;
        writeln!(s , "    Version: {}" , Self::version() ) ?; 
        writeln!(s , "    Deug   : {}" , cfg!(debug_assertions))? ;
        writeln!(s , "    Triple : {}" , Self::triple()) ? ;
        writeln!(s , "    Rustc  : {}" , Self::rustc()) ? ;

        writeln!(s , "\nJi") ? ;
        writeln!(s , "    Version: {}" , Self::process_output("ji" , "--version")) ? ;

        // let emulator = jizi_adapter::Emulator::detect() ;  待完善
        Ok(s)
        
    }

    fn process_output(name : impl AsRef<OsStr> , arg : impl AsRef<OsStr>) -> String {
        match std::process::Command::new(&name).arg(arg).output() { // 使用std::process::Command执行命令 并获取输出结果
            Ok(out) if out.status.success() => {
                // 如果命令执行成功匹配以下代码
                let line = 
                String::from_utf8_lossy(&if out.stdout.is_empty() {out.stderr} else {out.stdout}) // 将输出转化成字符串 
                .trim() // 去除首尾空格
                .lines() // 按行分割字符
                .next() // 获取第一行
                .unwrap_or_default() // 如果第一行不存在 则使用默认值空字符串
                .to_owned(); // 将字符串转成所有者类型
                if name.as_ref() == "ji" { // 如果命令是ji 那么去除前缀Ji
                    line.trim_start_matches("Ji ").to_owned()
                }else {  // 使用正则表达式提取版本信息
                    Regex::new(r"\d+\.\d+(\.\d+-\d+|\.\d+|\b)") 
                    .unwrap()
                    .find(&line) 
                    .map(|m| m.as_str().to_owned())
                    .unwrap_or(line)
                }
            }
            Ok(out) => format!("{:?},{:?}" , out.status , String::from_utf8_lossy(&out.stderr)) , // 命令执行失败 返回状态和错误码
            Err(e) => format!("{e}") , // 命令执行过程中出错
        }
    }
}